package com.atguigu.utils;

import io.jsonwebtoken.*;
import org.springframework.util.StringUtils;

import java.util.Date;

public class JwtHelper {

    //令牌的有限期
    private static long tokenExpiration = 24*60*60*1000;

    //自定义的字符串（盐值 ， 加盐加密）
    private static String tokenSignKey = "123456";

    //创建令牌
    public static String createToken(Long userId, String userName) {
        //生成jwt令牌的api
        String token = Jwts.builder()
                .setSubject("YYGH-USER") //令牌面向主体（令牌在那个模块哪个项目下有效）
                .setExpiration(new Date(System.currentTimeMillis() + tokenExpiration))//令牌的过期时间

                //跟业务相关的自定义的参数（令牌的载荷部分）
                .claim("userId", userId)
                .claim("userName", userName)


                .signWith(SignatureAlgorithm.HS512, tokenSignKey)//HS512加密算法 ，盐值 ==》 对令牌加密

                .compressWith(CompressionCodecs.GZIP) //令牌的压缩格式

                .compact();
        return token; //s1.s2.s3
    }


    //从令牌中解析userId
    public static Long getUserId(String token) {
        //判空
        if(StringUtils.isEmpty(token)) return null;

        //加密和解密使用的同一个盐值
        Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);

        //Claims中包括所有的自定义参数
        Claims claims = claimsJws.getBody();

        //从claims中根据自定义参数名获取参数值
        Integer userId = (Integer)claims.get("userId");

        return userId.longValue();
    }
    //从令牌中解析userName
    public static String getUserName(String token) {
        if(StringUtils.isEmpty(token)) return "";
        Jws<Claims> claimsJws
                = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);
        Claims claims = claimsJws.getBody();
        return (String)claims.get("userName");
    }

}